package com.zyx.xml.dom;

import javax.xml.parsers.*;
import java.io.*;

import cn.hutool.core.io.resource.ClassPathResource;
import org.w3c.dom.*;
import org.w3c.dom.ls.*;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;

/**
 * Description:
 * <br/>10.2.7 使用DOM修改XML文档
 *
 * @author Yaxi.Zhang
 * @since 2022/9/25 10:19
 */
public class DomUpdate {
    public static void main(String[] args) throws Exception {
        // DOM解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setIgnoringElementContentWhitespace(true);
        // 获取DOM解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 创建一个新的Document对象
        Document doc = builder.parse(new ClassPathResource("ch10_02/new.xml").getFile());
        // 获取文档中所有标签名为“name”的元素
        NodeList names = doc.getElementsByTagName("name");
        // 如果names节点列表不为null，且至少包含1个节点
        if (names != null && names.getLength() > 0) {
            //获取第一个节点
            Node name = names.item(0);
            //修改节点数据
            name.setTextContent("孙悟空");
        }

        // 获得DOMImplementationRegistry对象，它是获取DOMImplementation的工厂
        DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
        // 获取DOMImplementationLS对象
        DOMImplementationLS domImplLS = (DOMImplementationLS) registry.getDOMImplementation("LS");
        // 获取LSSerializer对象，它是专门用于序列化DOM树的的工具
        LSSerializer serializer = domImplLS.createLSSerializer();
        // 设置使用合理缩进使得XML文档更美观
        serializer.getDomConfig().setParameter("format-pretty-print", true);
        LSOutput out = domImplLS.createLSOutput();
        // 指定输出文档编码所用的字符集
        out.setEncoding("GB2312");
        FileWriter stringOut = new FileWriter("com-zyx-xml/src/main/resources/ch10_02/update.xml");
        out.setCharacterStream(stringOut);
        // 执行序列化（也就是将DOM树转换成XML文档）
        serializer.write(doc, out);
    }
}
